package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;

import patronDecorator.Producto;
import patronDecorator.ProductoDAO;
import patronMementoo.Cliente;

import modelo.*;


import Vista.NewJDialogOrden;

public class ControladorOrden {
	NewJDialogOrden dlg;
	ArrayList<Producto> detalles;
	AbstractTableModel modelo;
	double total;
	
	public ControladorOrden(JFrame frm) {
		dlg = new NewJDialogOrden(frm, this);
		
		detalles =  new ArrayList<Producto>();

		CategoriaDAO catdao = new CategoriaDAO();
		Vector<Categoria> categorias = catdao.ConsultarCategorias(null);//revisar porq no tenia parametros
		
		dlg.getjCmbCategoria().setModel(new DefaultComboBoxModel(categorias));
		dlg.getjCmbCategoria().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				ProductoDAO prdao = new ProductoDAO();
				Vector<Producto> productos = prdao.ConsultarProductoPorCategoria((Categoria) dlg.getjCmbCategoria().getSelectedItem());
				dlg.getjCmbProducto().setModel(new DefaultComboBoxModel(productos));
			}
		});
		
		{
			ProductoDAO prdao = new ProductoDAO();
			Vector<Producto> productos = prdao.ConsultarProductoPorCategoria((Categoria) dlg.getjCmbCategoria().getSelectedItem());
			dlg.getjCmbProducto().setModel(new DefaultComboBoxModel(productos));
		}
		
		dlg.getjBtoSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dlg.dispose();
			}
		});
		
		dlg.setVisible(true);
		modelo = new AbstractTableModel() {
			@Override
			public Object getValueAt(int rowIndex, int columnIndex) {
				Producto pr = detalles.get(rowIndex);
				switch (columnIndex) {
				case 0: return pr.getNombreProducto();
				case 1: return pr.getPrecio();
				}
				return null;
			}
			
			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Nombre";
				case 1: return "Precio";
				}
				
				return null;
			}

			@Override
			public int getRowCount() {
				return detalles.size();
			}
			
			@Override
			public int getColumnCount() {
				return 2;
			}
		};
		
		dlg.getjTbOrden().setModel(modelo);
		
		dlg.getjBtoAgregarProducto().addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if (dlg.getjCmbCategoria().getSelectedIndex() == -1 || dlg.getjCmbProducto().getSelectedIndex() == -1)
					JOptionPane.showMessageDialog(null, "Debe llenar los campos");
				else{
					Producto pr = (Producto)dlg.getjCmbProducto().getSelectedItem();
				total += pr.getPrecio();
				dlg.getjTxtMontoTotal().setText(Double.toString(total));
				detalles.add(pr);
				
				modelo.fireTableDataChanged();
				}
			}
		});
		
		dlg.getjBtoQuitarProducto().addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {				
				if(dlg.getjTbOrden().getSelectedRow() == -1){
					JOptionPane.showMessageDialog(null, " Debe Seleccionar un Producto", "Informacion", JOptionPane.INFORMATION_MESSAGE);
				}
				else{
				total -= detalles.get(dlg.getjTbOrden().getSelectedRow()).getPrecio();
				dlg.getjTxtMontoTotal().setText(Double.toString(total));
				detalles.remove(dlg.getjTbOrden().getSelectedRow());
				modelo.fireTableDataChanged();
				}
			}
		});
		
		dlg.getjBtoRegistrar().addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if (dlg.getjTxtCodigoCliente().getText().isEmpty() ||
					dlg.getjTxtCodigoOrden().getText().isEmpty()) {
					JOptionPane.showMessageDialog(null, "Rellene los campos de textos.");
					return;
				}
				
				PlantillaDAO pdao = new PlantillaDAO();
				IngredienteDAO idao = new IngredienteDAO();
				
				Vector<Ingrediente> ings = idao.ConsultarIngredientes();
				for (Ingrediente q : ings) {
					double cant = q.getCantidad();
					for (Producto pr : detalles) {
						Vector<Plantilla> pl = pdao.ConsultarPlantillasPorProducto(pr.getCodigoProducto());
						for (Plantilla p : pl)
							if (p.getCodigoIngrediente().equals(q.getCodigoIngrediente()))
								cant -= p.getCantidad();
					}
					
					if (cant < 0) {
						JOptionPane.showMessageDialog(null, "No hay ingredientes disponibles.");
						return;
					}
				}
				
				OrdenDAO odao = new OrdenDAO();
				DetalleOrdenDAO dodao = new DetalleOrdenDAO();
				odao.registrarOrden(new Orden(dlg.getjTxtCodigoOrden().getText(), dlg.getjTxtCodigoCliente().getText(), "", (float) total));
				
				for (Producto pr : detalles) {
					dodao.RegistrarDetalleOrden((new DetalleOrden(dlg.getjTxtCodigoOrden().getText(), pr.getCodigoProducto())));
				}
				
				for (Producto pr : detalles) {
					Vector<Plantilla> pl = pdao.ConsultarPlantillasPorProducto(pr.getCodigoProducto());
					for (Plantilla p : pl) {
						Ingrediente ing = idao.ConsultarIngrediente(p.getCodigoIngrediente());
						ing.setCantidad(ing.getCantidad() - p.getCantidad());
						idao.ModificarIngrediente(ing);
					}
				}
				
				dlg.dispose();
			}
		});
		dlg.getjBtoEliminar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				CategoriaDAO dao = new CategoriaDAO();
				dao.EliminarCategoria((((new Categoria(dlg.getjTxtCodigoOrden().getText(), dlg.getjTxtCodigoCliente().getText(), dlg.getjTxtMontoTotal().getText())))));
				dlg.dispose();
				JOptionPane.showMessageDialog(null, " Orden eliminada", "Informacion", JOptionPane.INFORMATION_MESSAGE);			
	       }
		});
		dlg.getJBtoOrdenBuscar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				OrdenDAO dao = new OrdenDAO();		
				
				Orden o = dao.ConsultarOrden(dlg.getjTxtCodigoOrden().getText()); //consultar
				if (o == null)
					JOptionPane.showMessageDialog(null, "No existe Orden. Puede continuar.");
				else {
					//dlg.getjTxtCodigoCliente().setText(o.getCodigoCliente());
					//dlg.getjTxtCodigoOrden().setText(o.getCodigoOrden());
					//dlg.getjTxtMontoTotal().setText(Float.toString((o.getPrecioTotal())));
					JOptionPane.showMessageDialog(null, "Orden Existente.Registre otra orden.");
				}
	}
		});
		dlg.getjBtoClienteOrden().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				ClienteDAO dao = new ClienteDAO();		
				
				Cliente cl = dao.ConsultarCliente(dlg.getjTxtCodigoCliente().getText()); //consultar
				if (cl == null)
					JOptionPane.showMessageDialog(null, "No existe el Cliente debe Registrarlo.");
				else {
					dlg.getjTxtCodigoOrden().setEnabled(true);
					dlg.getJBtoOrdenBuscar().setEnabled(true);
					dlg.getjBtoRegistrar().setEnabled(true);
					dlg.getjBtoEliminar().setEnabled(true);
				}
			}
		});
}
}